package com.ssy.lingxi.order.service.feign;

import com.ssy.lingxi.common.constant.order.OrderPayChannelEnum;
import com.ssy.lingxi.common.response.Wrapper;
import com.ssy.lingxi.order.model.bo.PaymentParameterBO;
import com.ssy.lingxi.order.model.constant.OrderPaymentCallbackStatusEnum;
import com.ssy.lingxi.order.model.dto.PayAmountDTO;

import java.math.BigDecimal;
import java.time.LocalDateTime;
import java.util.List;

/**
 * 支付服务OpenFeign接口
 * @author 万宁
 * @version 2.0.0
 * @date 2021-08-18
 */
public interface IPayFeignService {
    /**
     * 缓存通联支付参数
     * @param parameters 支付参数
     */
    void cacheAllInPayParameters(List<PaymentParameterBO> parameters);

    /**
     * 删除建行支付参数
     */
    void removeCcbPayParameters();

    /**
     * 微信Web Native支付
     * @param loginSource       用户登录来源（用于标识Web、App支付）
     * @param recipientMemberId 收款方会员Id
     * @param recipientRoleId   收款方会员角色Id
     * @param fundMode          资金归集模式
     * @param tradeNo           订单号
     * @param digest            订单摘要
     * @param payAmount         支付金额
     * @param attach            透传参数
     * @param merchantId         微信商户号
     * @param appId              微信AppId
     * @param apiKey             微信ApiKey
     * @param shopEnvironment   商城适用环境  ShopEnvironmentEnum.class
     * @return 二维码链接
     */
    Wrapper<String> weChatPay(Integer loginSource, Long recipientMemberId, Long recipientRoleId, Integer fundMode, String tradeNo, String digest, BigDecimal payAmount, String attach, String merchantId, String appId, String apiKey, Integer shopEnvironment);

    /**
     * 微信小程序支付
     * @param recipientMemberId 收款方会员Id
     * @param recipientRoleId   收款方会员角色Id
     * @param fundMode          资金归集模式
     * @param tradeNo           订单号
     * @param digest            订单摘要
     * @param payAmount         支付金额
     * @param attach            透传参数
     * @param merchantId         微信商户号
     * @param apiKey             微信ApiKey
     * @param appId              微信小程序AppId
     * @param appKey             微信小程序开发者密钥AppKey
     * @param weChatCode         小程序登录凭证
     * @return 二维码链接
     */
    Wrapper<String> weChatMiniAppPay(Long recipientMemberId, Long recipientRoleId, Integer fundMode, String tradeNo, String digest, BigDecimal payAmount, String attach, String merchantId, String apiKey, String appId, String appKey, String weChatCode);

    /**
     * 微信退款
     * @param recipientMemberId 收款方会员Id
     * @param recipientRoleId 收款方会员角色Id
     * @param fundMode 资金归集模式
     * @param tradeNo  支付单号
     * @param payAmount 订单支付金额
     * @param refundNo  退款单号
     * @param refundAmount 退款金额
     * @param merchantId 微信商户Id
     * @param appId      微信AppId
     * @param apiKey     微信ApiKey
     * @param keyPath    微信退款证书路径
     * @return 退款结果
     */
    Wrapper<Void> weChatRefund(Long recipientMemberId, Long recipientRoleId, Integer fundMode, String tradeNo, BigDecimal payAmount, String refundNo, BigDecimal refundAmount, String merchantId, String appId, String apiKey, String keyPath);

    /**
     * 支付宝支付
     * @param loginSource       用户登录来源（用于标识Web、App支付）
     * @param recipientMemberId 收款方会员Id
     * @param recipientRoleId   收款方会员角色Id
     * @param fundMode          资金归集模式
     * @param tradeNo           订单号
     * @param digest            订单摘要
     * @param payAmount         支付金额
     * @param attach            透传参数
     * @param appId             支付宝AppId
     * @param publicKey         支付宝publicKey
     * @param privateKey        支付宝privateKey
     * @param appAuthToken      支付宝第三方授权Token
     * @param shopEnvironment   商城适用环境  ShopEnvironmentEnum.class
     * @return 二维码链接
     */
    Wrapper<String> aliPay(Integer loginSource, Long recipientMemberId, Long recipientRoleId, Integer fundMode, String tradeNo, String digest, BigDecimal payAmount, String attach, String appId, String publicKey, String privateKey, String appAuthToken,Integer shopEnvironment);

    /**
     * 支付宝退款
     * @param vendorMemberId 供应会员Id
     * @param vendorRoleId   供应会员角色id
     * @param fundMode       资金归集模式
     * @param tradeNo        交易单号
     * @param refundNo       退款单号
     * @param refundAmount   退款金额
     * @param appId          支付宝AppId
     * @param publicKey      支付宝公钥
     * @param privateKey     支付宝私钥
     * @param appAuthToken   支付宝第三方授权Token
     * @return 退款结果
     */
    Wrapper<Void> aliPayRefund(Long vendorMemberId, Long vendorRoleId, Integer fundMode, String tradeNo, String refundNo, BigDecimal refundAmount, String appId, String publicKey, String privateKey, String appAuthToken);

    /**
     * 余额支付
     * @param buyerMemberId 采购会员Id
     * @param buyerRoleId   采购会员角色Id
     * @param recipientMemberId 收款方会员Id
     * @param recipientRoleId   收款方会员角色Id
     * @param fundMode 资金归集模式
     * @param orderNo 订单号
     * @param payAmount 支付金额
     * @param payPassword Aes加密后的支付密码
     * @return 支付结果
     */
    Wrapper<String> balancePay(Long buyerMemberId, Long buyerRoleId, Long recipientMemberId, Long recipientRoleId, Integer fundMode, String orderNo, BigDecimal payAmount, String payPassword);

    /**
     * 余额支付退款
     * @param tradeNo 交易单号
     * @param refundAmount 退款金额
     * @param remark 备注
     * @return 退款结果
     */
    Wrapper<Void> balancePayRefund(String tradeNo, BigDecimal refundAmount, String remark);

    /**
     * 通联支付
     * @param loginSource       用户登录来源（用于标识Web、App支付）
     * @param orderPayChannel   支付渠道
     * @param buyerMemberId     采购会员Id
     * @param buyerRoleId       采购会员角色Id
     * @param fundMode          资金归集模式
     * @param payAmount         支付总金额
     * @param payAmounts        （如果是会员直接到账）收款方会员Id、角色Id、付款金额列表
     * @param tradeNo           付款交易号
     * @param attach            透传参数
     * @param weChatCode        小程序登录凭证
     * @return 支付结果
     */
    Wrapper<String> allInPay(Integer loginSource, OrderPayChannelEnum orderPayChannel, Long buyerMemberId, Long buyerRoleId, Integer fundMode, BigDecimal payAmount, List<PayAmountDTO> payAmounts, String tradeNo, String attach, String weChatCode);

    /**
     * 通联支付 退款
     * @param buyerMemberId 采购会员Id（付款方会员Id）
     * @param buyerRoleId   采购会员角色Id（付款方会员角色Id）
     * @param fundMode          资金归集模式
     * @param payAmount         支付金额
     * @param tradeNo           （支付）交易号
     * @param refundNo          退款交易号
     * @return 退款结果
     */
    Wrapper<Void> allInPayRefund(Long buyerMemberId, Long buyerRoleId, Integer fundMode, BigDecimal payAmount, String tradeNo, String refundNo);

    /**
     * 建行B2B支付
     * @param buyerMemberName   采购会员名称
     * @param payAmount         支付总金额
     * @param tradeNo           付款交易号
     * @param attach            透传参数
     * @param merchantId        建行支付商户号
     * @param password          建行支付密码
     * @param branchId          建行支付分行代码
     * @param posId             建行支付商户柜台代码
     * @param publicKey         建行支付柜台公钥
     * @param timeoutDateTime   建行支付超时时间，格式为yyyyMMddHHmmss
     * @return 支付结果
     */
    Wrapper<String> ccbPay(String buyerMemberName, BigDecimal payAmount, String tradeNo, String attach, String merchantId, String password, String branchId, String posId, String publicKey, String timeoutDateTime);

    /**
     * 建行B2B支付退款
     * @param tradeNo           支付订单号
     * @param refundNo          退款订单号
     * @param payAmount         支付金额
     * @return 退款结果
     */
    Wrapper<Void> ccbPayRefund(String tradeNo, String refundNo, BigDecimal payAmount);

    /**
     * 建行数字人民币支付
     * @param loginSource       用户登录来源（用于标识Web、App支付）
     * @param buyerMemberName   采购会员名称
     * @param payAmount         支付总金额
     * @param tradeNo           付款交易号
     * @param attach            透传参数
     * @param merchantId        建行支付商户号
     * @param branchId          建行支付分行代码
     * @param posId             建行支付商户柜台代码
     * @param publicKey         建行支付柜台公钥
     * @param timeoutDateTime   建行支付超时时间，格式为yyyyMMddHHmmss
     * @param settlementAccount 商户结算账户
     * @param subMerchantId     二级商户号
     * @param returnUrl         退出支付流程时返回商户URL(H5支付才生效，二维码支付不生效)
     * @return 支付结果
     */
    Wrapper<String> ccbDigitalPay(Integer loginSource, String buyerMemberName, BigDecimal payAmount, String tradeNo, String attach, String merchantId, String branchId, String posId, String publicKey, String timeoutDateTime, String settlementAccount, String subMerchantId, String returnUrl);

    /**
     * 建行数字人民币支付退款
     * @param orderCreateTime   订单创建时间
     * @param tradeNo           支付订单号
     * @param refundNo          退款订单号
     * @param payAmount         支付金额
     * @return 退款结果
     */
    Wrapper<Void> ccbDigitalPayRefund(LocalDateTime orderCreateTime, String tradeNo, String refundNo, BigDecimal payAmount);

    /**
     * 查询建行B2B支付订单
     * @param tradeNo     付款交易号
     * @param merchantId  建行支付商户号
     * @param branchId    建行支付分行代码
     * @param posId       建行支付商户柜台代码
     * @param password    建行支付密码
     * @return 查询结果
     */
    Wrapper<OrderPaymentCallbackStatusEnum> queryCcbOrders(String tradeNo, String merchantId, String branchId, String posId, String password);

    /**
     * “会员支付参数”配置时，如果会员配置了授信额度支付，通知支付服务创建授信账户
     * @param memberId 会员Id
     * @param roleId 会员角色Id
     */
    void notifyCreditAsync(Long memberId, Long roleId);

    /**
     * 查询会员授信是否存在
     * @param buyerMemberId 采购会员Id
     * @param buyerRoleId   采购会员角色Id
     * @param vendorMemberId 供应会员Id
     * @param vendorRoleId  供应会员角色Id
     * @return true-存在，false-服务异常或不存在
     */
    Boolean findMemberCredit(Long buyerMemberId, Long buyerRoleId, Long vendorMemberId, Long vendorRoleId);

    /**
     * 授信支付
     * @param buyerMemberId 采购会员Id
     * @param buyerRoleId   采购会员角色Id
     * @param recipientMemberId 收款方会员Id
     * @param recipientRoleId   收款方会员角色Id
     * @param fundMode 资金归集模式
     * @param orderNo 订单号
     * @param payAmount 支付金额
     * @param payPassword Aes加密后的支付密码
     * @return 支付结果
     */
    Wrapper<String> creditPay(Long buyerMemberId, Long buyerRoleId, Long recipientMemberId, Long recipientRoleId, Integer fundMode, String orderNo, BigDecimal payAmount, String payPassword);

    /**
     * 授信支付退款
     * @param buyerMemberId 采购会员Id
     * @param buyerRoleId   采购会员角色Id
     * @param recipientMemberId 收款方会员Id
     * @param recipientRoleId   收款方会员角色Id
     * @param tradeNo 支付单号
     * @param refundAmount 退款金额
     * @param reason  备注说明
     * @return 退款单号
     */
    Wrapper<String> creditPayRefund(Long buyerMemberId, Long buyerRoleId, Long recipientMemberId, Long recipientRoleId, String tradeNo, BigDecimal refundAmount, String reason);
}
